package cn.ok.examples;

import cn.ok.domains.Message;
import cn.ok.domains.RuleTreeOrbit;
import cn.ok.factories.KieSessionFactory;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;

import java.util.concurrent.TimeUnit;

/**
 * @author kyou on 2019-09-16 19:21
 */
@Slf4j
public class RuleTree {
    // kieSession name 需要与 kmodule.xml 文件中指定的名称保持一致。
    private static final String KieSessionName = "RuleTreeKS";
    private KieSession kieSession;

    @Before
    public void setUp() {
        log.debug("RuleTree start.");
    }

    @After
    public void tearDown() {

        // and then dispose the session
        if (kieSession != null) {
            log.debug("Dispose the kieSession.");
            kieSession.dispose();
        }

        log.debug("RuleTree end.");
    }

    /**
     * 将规则按照树的形式，分支运行。
     */
    @Test
    public void ruleTree() {
        kieSession = KieSessionFactory.getKieSession(KieSessionName);

        // 插入记录规则执行轨迹的对象。
        FactHandle ruleOrbitFact = kieSession.insert(new RuleTreeOrbit());

        // 插入与规则树碰撞的业务对象。
        Message message1 = new Message();
        message1.setMessage("message_1");
        message1.setStatus(1);
        kieSession.insert(message1);

        Stopwatch stopwatch = Stopwatch.createStarted();

        // 执行规则（树）
        kieSession.fireAllRules();

        log.debug("used: {} ms.", stopwatch.elapsed(TimeUnit.MILLISECONDS));

        // 获取执行结果
        log.debug(kieSession.getObject(ruleOrbitFact).toString());
    }
}
